#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <mqueue.h>
#include <unistd.h>
#include <pthread.h>

mqd_t mqd1;

void *pthread_fun1(void *arg){
    printf("线程1 \n");
    //发送
    int result = mq_send(mqd1,"aaaaa",5,1);
    if (result == -1)
    {
        printf("send file \n");
        return (void *)-1;
    }
    printf("send success\n");
    return NULL;
}

void *pthread_fun2(void *arg){
    printf("线程2 \n");
    sleep(1);
    char rec[20] = {};                        //接受缓冲区大小必须大于消息队列的属性mq_msgsize
    ssize_t result = mq_receive(mqd1,rec,10,NULL);
    if (result == -1)
    {
        printf("receive file \n");
    }
    printf("%s\n",rec);
    return NULL;
}

int main(int argc, char const *argv[])
{
    //创建队列
    struct mq_attr attr;
    attr.mq_flags = 0;          // 阻塞模式（默认）
    attr.mq_maxmsg = 10;        // 最大消息数（自定义，如10）
    attr.mq_msgsize = 10;       // 单条消息最大10字节（≤ 接收缓冲区大小10）
    mqd1 = mq_open("/mq1",O_RDWR | O_CREAT,0666,&attr);
    if (mqd1 == (mqd_t)-1) {
        perror("mq_open failed");
        exit(1);
    }

    pthread_t pth1,pth2;
    //创建两个线程
    int ret1 = pthread_create(&pth1,NULL,pthread_fun1,NULL);
    int ret2 = pthread_create(&pth2,NULL,pthread_fun2,NULL);
    if (ret1 != 0 || ret2 != 0) {
        perror("pthread_create failed");
        mq_close(mqd1);  // 失败时清理资源
        mq_unlink("/mq1");
        exit(1);
    }
    
    //等待两个线程结束
    pthread_join(pth1,NULL);
    pthread_join(pth2,NULL);

    mq_close(mqd1);          // 关闭消息队列描述符
    mq_unlink("/mq1");       // 从系统中删除消息队列

    printf("主线成结束");
    return 0;
}



